#!/bin/bash

# uv 卸载脚本 (使用 winget)
# 此脚本通过 Windows 的 winget 包管理器卸载 uv 程序
# 可以在 Windows Subsystem for Linux (WSL) 或支持 shell 脚本的 Windows 环境中运行

set -e  # 遇到错误时退出脚本

# 显示标题
echo "========================================"
echo "      uv 卸载脚本 (使用 winget)      "
echo "========================================"

# 检查是否在 Windows 环境中
if [[ "$OSTYPE" == "msys" ]] || [[ "$OSTYPE" == "win32" ]]; then
    # 直接在 Windows 的 MSYS2/Git Bash 环境中
    echo "检测到 Windows 环境，准备执行 winget 命令..."
    
    # 检查 winget 是否可用
    echo "\n检查 winget 是否已安装..."
    if ! command -v winget &> /dev/null; then
        echo "错误: winget 未找到! 请确保已安装 Windows 包管理器。"
        echo "提示: winget 通常预装在 Windows 10 1709+ 和 Windows 11 系统中。"
        echo "      或者可以从 Microsoft Store 安装 App Installer。"
        exit 1
    fi
    
    echo "winget 已找到，版本信息:"
    winget --version
    
    # 查找 uv 包
    echo "\n查找已安装的 uv 包..."
    UV_PACKAGE=$(winget list --exact "uv" --accept-source-agreements 2>/dev/null || echo "")
    
    if [[ -z "$UV_PACKAGE" ]]; then
        echo "未找到已安装的 uv 包。可能 uv 未通过 winget 安装，或使用了不同的包名。"
        echo "\n尝试查找所有可能的 uv 相关包..."
        winget list "uv" --accept-source-agreements || echo "未找到任何相关包"
        exit 0
    fi
    
    echo "找到已安装的 uv 包:"
    echo "$UV_PACKAGE"
    
    # 提取包 ID
    UV_PACKAGE_ID=$(echo "$UV_PACKAGE" | grep -oP '(?<=\s)\S+(?=\s+[0-9])' | head -1)
    
    if [[ -z "$UV_PACKAGE_ID" ]]; then
        echo "错误: 无法提取 uv 包的 ID。"
        echo "尝试直接使用包名 'uv' 进行卸载..."
        UV_PACKAGE_ID="uv"
    fi
    
    echo "\n准备卸载包: $UV_PACKAGE_ID"
    
    # 执行卸载
    echo "执行卸载命令..."
    if winget uninstall --exact "$UV_PACKAGE_ID" --accept-source-agreements --silent; then
        echo "\n✅ uv 卸载成功!"
        
        # 验证卸载
        echo "\n验证卸载状态..."
        if winget list --exact "$UV_PACKAGE_ID" --accept-source-agreements 2>/dev/null; then
            echo "⚠️  警告: uv 似乎仍在已安装列表中，请手动确认。"
        else
            echo "✅ uv 已成功从系统中移除。"
        fi
    else
        echo "\n❌ uv 卸载失败!"
        echo "错误码: $?"
        echo "\n建议:"
        echo "1. 以管理员身份运行此脚本"
        echo "2. 检查 uv 是否正在运行，关闭所有相关进程"
        echo "3. 尝试手动卸载: 控制面板 > 程序和功能"
        exit 1
    fi
    
else
    # 在 WSL 或 Linux 环境中，需要通过 Windows 命令执行 winget
    echo "检测到非 Windows 环境，尝试通过 Windows 命令执行 winget..."
    
    # 检查是否可以访问 Windows 命令
    if ! command -v cmd.exe &> /dev/null; then
        echo "错误: 无法访问 cmd.exe，无法执行 Windows 命令。"
        echo "请确保在 WSL 或支持 Windows 命令的环境中运行。"
        exit 1
    fi
    
    # 使用 cmd.exe 执行 winget 命令
    echo "\n检查 winget 是否已安装..."
    if ! cmd.exe /c "winget --version" 2>/dev/null; then
        echo "错误: winget 未找到! 请确保已安装 Windows 包管理器。"
        exit 1
    fi
    
    echo "winget 已找到。"
    
    # 查找 uv 包
    echo "\n查找已安装的 uv 包..."
    UV_PACKAGE=$(cmd.exe /c "winget list --exact \"uv\" --accept-source-agreements" 2>/dev/null || echo "")
    
    if [[ -z "$UV_PACKAGE" || ! "$UV_PACKAGE" =~ [0-9]\.[0-9] ]]; then
        echo "未找到已安装的 uv 包。"
        exit 0
    fi
    
    echo "找到已安装的 uv 包。"
    
    # 执行卸载
    echo "\n执行卸载命令..."
    if cmd.exe /c "winget uninstall --exact \"uv\" --accept-source-agreements --silent"; then
        echo "\n✅ uv 卸载成功!"
    else
        echo "\n❌ uv 卸载失败!"
        echo "错误码: $?"
        echo "建议以管理员身份运行此脚本。"
        exit 1
    fi
fi

echo "\n========================================"
echo "卸载过程完成!"
echo "========================================"

exit 0